/**
 * 数据库初始化脚本
 * 
 * 运行方式: node scripts/init-db.js
 */

const { Sequelize } = require('sequelize');
const path = require('path');
const fs = require('fs');
const { exec } = require('child_process');
const config = require('../src/config/database');
const models = require('../src/models');
const bcrypt = require('bcrypt');
const logger = require('../src/utils/logger');

// 环境变量设置
const NODE_ENV = process.env.NODE_ENV || 'development';
const dbConfig = config[NODE_ENV];

// 连接数据库
const sequelize = new Sequelize(
  dbConfig.database,
  dbConfig.username,
  dbConfig.password,
  {
    host: dbConfig.host,
    dialect: dbConfig.dialect,
    storage: dbConfig.storage, // 仅SQLite需要
    logging: msg => logger.debug(msg)
  }
);

// 运行迁移
const runMigrations = () => {
  return new Promise((resolve, reject) => {
    logger.info('开始运行数据库迁移...');
    
    // 使用sequelize-cli运行迁移
    const npxCommand = process.platform === 'win32' ? 'npx.cmd' : 'npx';
    const migrationCommand = `${npxCommand} sequelize-cli db:migrate`;
    
    exec(migrationCommand, (error, stdout, stderr) => {
      if (error) {
        logger.error('迁移执行出错:', error);
        return reject(error);
      }
      
      if (stderr) {
        logger.warn('迁移警告:', stderr);
      }
      
      logger.info('迁移输出:', stdout);
      logger.info('迁移执行完成');
      resolve();
    });
  });
};

// 创建默认管理员用户
const createAdminUser = async () => {
  try {
    logger.info('检查默认管理员用户...');
    
    // 检查是否已存在管理员
    const adminCount = await models.User.count({
      where: {
        role: 'admin'
      }
    });
    
    if (adminCount > 0) {
      logger.info('已存在管理员用户，跳过创建');
      return;
    }
    
    // 创建默认管理员账户
    const defaultPassword = 'admin123';
    const hashedPassword = await bcrypt.hash(defaultPassword, 10);
    
    await models.User.create({
      username: 'admin',
      password: hashedPassword,
      email: 'admin@example.com',
      fullName: '系统管理员',
      role: 'admin',
      status: 'active'
    });
    
    logger.info('已创建默认管理员用户 (用户名: admin, 密码: admin123)');
  } catch (error) {
    logger.error('创建管理员用户失败:', error);
    throw error;
  }
};

// 创建基本设置
const createDefaultSettings = async () => {
  try {
    logger.info('检查系统设置...');
    
    // 检查是否已存在设置
    const settingsCount = await models.Setting.count();
    
    if (settingsCount > 0) {
      logger.info('系统设置已存在，跳过创建');
      return;
    }
    
    // 创建基本系统设置
    await models.Setting.create({
      key: 'system.name',
      value: 'WhatsApp中间平台',
      type: 'string',
      category: 'system',
      description: '系统名称'
    });
    
    await models.Setting.create({
      key: 'message.autoReply.enabled',
      value: 'false',
      type: 'boolean',
      category: 'message',
      description: '是否启用自动回复'
    });
    
    await models.Setting.create({
      key: 'message.autoReply.text',
      value: '感谢您的消息，我们将尽快回复您。',
      type: 'string',
      category: 'message',
      description: '自动回复文本'
    });
    
    logger.info('已创建默认系统设置');
  } catch (error) {
    logger.error('创建系统设置失败:', error);
    throw error;
  }
};

// 主函数
const initializeDatabase = async () => {
  try {
    // 测试数据库连接
    await sequelize.authenticate();
    logger.info('数据库连接成功');
    
    // 运行迁移
    await runMigrations();
    
    // 创建默认数据
    await createAdminUser();
    await createDefaultSettings();
    
    logger.info('数据库初始化完成！');
    process.exit(0);
  } catch (error) {
    logger.error('数据库初始化失败:', error);
    process.exit(1);
  }
};

// 执行初始化
initializeDatabase(); 